#include <bits/stdc++.h>

using uint=unsigned int;
using ll=long long;
using ull=unsigned long long;
using i128=__int128;

const int N=1e6+5;

bool check(std::vector<int> nums,int k,int mid){
    int sum=0;
    int cnt=1;
    for(int num:nums){
        if(sum+num>mid){
            sum=num;
            cnt++;
        }
        else{
            sum+=num;
        }
    }

    return cnt<=k;
}

int erf(std::vector<int> nums,int k){
    int l=*max_element(nums.begin(),nums.end());
    int r=0;
    for(int num:nums){
        r+=num;
    }
    while(l<r){
        int mid=l+(r-l)/2;
        if(check(nums,k,mid)){
            r=mid;
        }else{
            l=mid+1;
        }
    }
    return l;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); std::cout.tie(nullptr);
    int n,k;
    std::cin>>n>>k;
    std::vector<int> nums(n);
    for(int i=0;i<n;i++){
        std::cin>>nums[i];
    }
    int res=erf(nums,k);
    std::cout<<res<<std::endl;

    return 0;
}
// 题目：最大值最小化
// 描述：
// 有一个包含n个元素的序列，要把它划分成k个子序列，每个子序列是原序列的一个连续部分。第i个子序列的和为Si。在所有的S中，
// 有一个最大的。要求对序列进行合理划分，使得最大的子序列和的S最小，并输出这个和。
// 输入格式
// 第一行 两个正整数n和k，分别表示序列中元素个数和要划分子序列数。0<k<=n<=1e6。
// 第二行 n个数a1, a2, ..., an，分别表示n个点在直线上的坐标。0<=|ai|<=1e6
// 输出格式
// 一个数，表示答案。
// 输入样例
// 10 3
// 1 3 4 5 7 9 11 13 15 17
// 输出样例
// 32